// 统计1~n整数中出现1的次数
// 1 - 10 [1, 10] => 2
// 1 - 20 [1 10 11 ...19] => 12

/**
 * 整体思想：以字符串的形式进行遍历
 * 方法1: 将数字转换为字符串，使用正则匹配其中出现的1的数量
 * 方法2: 将数字转换为字符串，再转换成数组，
 *        通过filter方法过滤出为1的值
 */

function findOne(n) {
    // 1. 创建一个长度为 n 的数组，初始值都为 undefined
    return Array.from({ length: n })
        // 2. 将数组中的每个 undefined 转换为对应的索引值加 1（即 1 到 n 的整数）
        .map((v, i) => i + 1)
        // 3. 使用 reduce 方法累加每个数字中 '1' 的出现次数
        .reduce((pre, cur) => {
            // 4. 将当前数字转换为字符串 111
            // 5. 将字符串拆分为单个字符的数组 ['1','1','1']
            // 6. 过滤出数组中等于 '1' 的字符
            // 7. 计算过滤后的数组长度，即当前数字中 '1' 的出现次数
            const curCount = String(cur).split('').filter(i => i === '1').length;
            // 8. 将当前数字中 '1' 的出现次数累加到总和中
            return pre + curCount;
        }, 0);
};

// 9. 调用函数并打印结果：计算 1 到 33 之间所有数字中 '1' 的出现总次数
console.log(findOne(100));